"""
表单模板管理 API
严格按照原 Flask 项目的接口实现，保持 100% 兼容性
使用标准的 FastAPI 流程：schemas + crud + models
"""
from typing import Optional
from fastapi import APIRouter, Depends, Query, Request
# pyright: reportMissingImports=false
from sqlalchemy.ext.asyncio import AsyncSession  


from  core.database import get_db
from  crud import template as crud_template
from  schemas.template import (
    TemplateFlaskResponse,
    TemplateNameOnly,
    TemplateNameWithVersion,
    TemplateQueryResponse
)
from  api.deps import get_current_active_doctor
from  models.doctor import Doctor

router = APIRouter()


# ============================================
# 注意：具体路由必须在动态路由之前定义！
# 路由匹配顺序：从上到下，第一个匹配的路由会被使用
# ============================================

@router.get("/allnames")
async def get_all_template_names(
    db: AsyncSession = Depends(get_db),
):
    """
    查询所有模板表的名称
    原接口: GET /api/form-templates/allnames
    使用标准流程: CRUD + Schema
    """
    try:
        # 使用 CRUD 层查询所有模板
        templates = await crud_template.get_all(db)
        
        # 使用 Schema 序列化
        template_list = [
            TemplateNameOnly.model_validate(t).to_flask_format()
            for t in templates
        ]
        
        return {
            "message": "获取所有模板表名称成功",
            "data": template_list,
            "code": 0
        }
        
    except Exception as e:
        return {
            "message": f"服务器错误: {str(e)}",
            "code": 1
        }


@router.get("/allnameswithversion/active")
async def get_active_template_names_with_version(
    db: AsyncSession = Depends(get_db),
):
    """
    查询所有模板表的名称及其当前版本号--仅返回活跃的模板
    原接口: GET /api/form-templates/allnameswithversion/active
    使用标准流程: CRUD + Schema
    """
    try:
        # 使用 CRUD 层查询活跃模板
        templates = await crud_template.get_active(db)
        
        # 使用 Schema 序列化--仅返回需要的字段--id, name, version
        template_list = [
            TemplateNameWithVersion.model_validate(t).to_flask_format()
            for t in templates
        ]
        
        return {
            "message": "获取所有模板表名称及其当前版本号成功",
            "data": template_list,
            "code": 0
        }
        
    except Exception as e:
        return {
            "message": f"服务器错误: {str(e)}",
            "code": 1
        }


@router.get("/query")
async def query_template_version_history(
    name: Optional[str] = Query(None, description="模板名称"),
    date: Optional[str] = Query(None, description="日期 YYYY-MM-DD"),
    db: AsyncSession = Depends(get_db),
):
    """
    条件查询模板表：模板名称，日期
    传入（非必须，若无则查询所有）：模板名称，日期  
    返回：所有符合条件的组数据：模板表名称，当前版本号,状态，所有的历史版本号，创建时间
    原接口: GET /api/form-templates/query
    使用标准流程: CRUD + Schema
    """
    try:
        # 解析日期参数
        query_date = None
        if date:
            try:
                from datetime import datetime as dt
                query_date = dt.strptime(date, '%Y-%m-%d')
            except ValueError:
                return {
                    "message": "日期格式错误，请使用 YYYY-MM-DD 格式",
                    "code": 1
                }
        
        # 使用 CRUD 层条件查询
        templates = await crud_template.query_by_conditions(
            db,
            name=name,
            date=query_date
        )
        
        # 使用 Schema 序列化 - 返回特定格式
        result_data = [
            TemplateQueryResponse.model_validate(t).to_flask_format()
            for t in templates
        ]
        
        return {
            "message": "条件查询模板表成功",
            "data": result_data,
            "code": 0
        }
        
    except Exception as e:
        return {
            "message": f"服务器错误: {str(e)}",
            "code": 1
        }


@router.delete("/deletebyid/{template_id}")
async def delete_form_template(
    template_id: int,
    db: AsyncSession = Depends(get_db),
):
    """
    根据ID停用或恢复表单模板
    原接口: DELETE /api/form-templates/deletebyid/<template_id>
    使用标准流程: CRUD
    """
    try:
        # 使用 CRUD 层切换状态
        template, new_status = await crud_template.toggle_active(db, template_id=template_id)
        
        if not template:
            return {
                "message": "表单模板不存在",
                "code": 1
            }
        
        await db.commit()
        
        # 根据操作结果返回相应消息
        action_message = "恢复" if new_status else "停用"
        return {
            "message": f"{action_message}表单模板成功",
            "code": 0
        }
        
    except Exception as e:
        await db.rollback()
        return {
            "message": f"服务器错误: {str(e)}",
            "code": 1
        }


@router.put("/updateversion/{template_id}")
async def update_template_version(
    template_id: int,
    request: Request,
    db: AsyncSession = Depends(get_db),
):
    """
    修改模板表的版本号
    原接口: PUT /api/form-templates/updateversion/<template_id>
    使用标准流程: CRUD
    """
    try:
        # 从请求体获取版本号
        data = await request.json()
        version = data.get('version')

        if not version:
            return {
                "message": "版本号不能为空",
                "code": 1
            }
        
        # 使用 CRUD 层更新版本号
        template, error_msg = await crud_template.update_version(
            db,
            template_id=template_id,
            version=version
        )
        
        if error_msg:
            return {
                "message": error_msg,
                "code": 1
            }
        
        await db.commit()
        
        return {
            "message": "模板表版本号修改成功",
            "code": 0
        }

    except Exception as e:
        await db.rollback()
        return {
            "message": f"服务器错误: {str(e)}",
            "code": 1
        }


# ============================================
# 动态路由：放在最后，避免拦截具体路由
# ============================================

@router.get("/{template_id}")
async def get_form_template_by_id(
    template_id: int,
    db: AsyncSession = Depends(get_db),
):
    """
    根据ID获取表单模板详情
    原接口: GET /api/form-templates/<template_id>
    使用标准流程: CRUD + Schema
    """
    try:
        # 1. 使用 CRUD 层查询
        template = await crud_template.get(db, id=template_id)
        
        if not template:
            return {
                "message": "表单模板不存在",
                "code": 1
            }
        
        # 2. 使用 Schema 序列化并转换为 Flask 格式
        template_data = TemplateFlaskResponse.model_validate(template).to_flask_format()
        
        return {
            "message": "获取表单模板成功",
            "data": template_data,
            "code": 0
        }
        
    except Exception as e:
        return {
            "message": f"服务器错误: {str(e)}",
            "code": 1
        }
